كيفية نشر تطبيقات PHP متعددة باستخدام Ansible على Ubuntu: الدليل الشامل لإدارة النشر الآلي
الكلمات المفتاحية:
Ansible, نشر التطبيقات, Ubuntu, PHP, DevOps, الأتمتة, خوادم متعددة, إعداد السيرفرات, التهيئة التلقائية, LAMP, Playbook, SSH, CI/CD
مقدمة
في بيئات التطوير الحديثة التي تعتمد على فلسفة DevOps، أصبحت أتمتة النشر وصيانة التطبيقات ضرورة أساسية لضمان الأداء المستقر والتوسع السلس. وبالنسبة للمطورين الذين يعملون باستخدام لغة PHP، قد يكون من الشائع تشغيل تطبيقات متعددة على نفس الخادم أو عبر خوادم Ubuntu مختلفة.
هنا يظهر دور Ansible كأداة قوية ومفتوحة المصدر تتيح إمكانية تنفيذ عمليات معقدة مثل التهيئة، التثبيت، التكوين، ونشر التطبيقات عبر شبكات خوادم متعددة بشكل متسق وآمن.
هذا المقال يقدم دليلاً عملياً مفصلاً عن كيفية استخدام Ansible لنشر تطبيقات PHP متعددة على نظام Ubuntu. سيغطي المقال إعداد البيئة، كتابة ملفات Playbook، إدارة الأدوار، التعامل مع قواعد البيانات، إعداد Apache/Nginx، والتعامل مع الحزم والاعتمادات الخاصة بكل تطبيق.
أولاً: لمحة عن Ansible
Ansible هو إطار عمل يعتمد على لغة YAML لتنفيذ عمليات إدارة الأنظمة عن بعد. يستخدم بروتوكول SSH للتواصل مع الخوادم، مما يجعله سهل الاستخدام ولا يتطلب تثبيت أي عميل على الطرف الآخر.
من مميزاته:
-
لا يحتاج إلى عميل Agent
-
يستخدم لغة YAML لكتابة Playbooks
-
يدعم إدارة التكوين والتحديث والنشر
-
يمكن استخدامه على أي نظام Unix-like
ثانياً: تحضير بيئة العمل
1. تثبيت Ansible
يجب أولاً تثبيت Ansible على الجهاز الذي سيكون بمثابة “المايسترو” الذي يدير عمليات النشر.
bashsudo apt update sudo apt install ansible -y
2. تهيئة ملف الجرد (Inventory File)
في Ansible، يُستخدم ملف الجرد لتعريف الخوادم الهدف التي سيتم تنفيذ المهام عليها.
ini[webservers]
192.168.1.100 ansible_user=ubuntu
192.168.1.101 ansible_user=ubuntu
3. إعداد الوصول عبر SSH
يجب تفعيل الوصول بدون كلمة مرور عبر SSH لضمان التنفيذ التلقائي.
ثالثاً: هيكلة المشروع
يوصى باستخدام الهيكل القياسي لمشاريع Ansible لتسهيل الصيانة والتنظيم. المثال التالي يوضح بنية المجلدات:
cssmulti-php-deploy/
├── ansible.cfg
├── inventory
├── playbooks/
│ ├── main.yml
│ ├── app1.yml
│ └── app2.yml
├── roles/
│ ├── common/
│ ├── apache/
│ ├── php/
│ ├── mysql/
│ └── app1/
│ └── tasks/
│ └── main.yml
رابعاً: إنشاء Playbook رئيسي
ملف main.yml
yaml- hosts: webservers
become: true
roles:
- common
- apache
- php
- mysql
- { role: app1, tags: ['app1'] }
- { role: app2, tags: ['app2'] }
خامساً: إعداد الأدوار Roles
1. دور common
المسؤول عن المهام العامة مثل التحديث وتثبيت الأدوات الأساسية.
yaml# roles/common/tasks/main.yml
- name: تحديث النظام
apt:
update_cache: yes
upgrade: dist
- name: تثبيت أدوات النظام الأساسية
apt:
name: ['git', 'curl', 'zip', 'unzip']
state: present
2. دور Apache
yaml# roles/apache/tasks/main.yml
- name: تثبيت Apache
apt:
name: apache2
state: present
- name: تفعيل mod_rewrite
apache2_module:
name: rewrite
state: present
- name: التأكد من تشغيل Apache
service:
name: apache2
state: started
enabled: true
3. دور PHP
yaml# roles/php/tasks/main.yml
- name: تثبيت PHP والحزم الأساسية
apt:
name:
- php
- php-mysql
- php-cli
- php-curl
- libapache2-mod-php
state: present
4. دور MySQL
yaml# roles/mysql/tasks/main.yml
- name: تثبيت MySQL
apt:
name: mysql-server
state: present
- name: تأمين MySQL
shell: |
mysql_secure_installation < args:
executable: /bin/bash
سادساً: إعداد تطبيقات PHP
1. إعداد تطبيق App1
yaml# roles/app1/tasks/main.yml
- name: نسخ ملفات التطبيق إلى الخادم
copy:
src: /local/path/app1/
dest: /var/www/app1/
owner: www-data
group: www-data
mode: '0755'
- name: إعداد ملف vhost لـ Apache
template:
src: app1.conf.j2
dest: /etc/apache2/sites-available/app1.conf
- name: تفعيل الموقع
shell: |
a2ensite app1.conf
systemctl reload apache2
2. قالب vhost (Jinja2 Template)
apacheServerName app1.example.com DocumentRoot /var/www/app1 AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/app1_error.log CustomLog ${APACHE_LOG_DIR}/app1_access.log combined
سابعاً: تشغيل الـ Playbook
لتنفيذ عملية النشر:
bashansible-playbook -i inventory playbooks/main.yml --tags "app1"
يمكن تنفيذ نشر التطبيق الثاني عبر:
bashansible-playbook -i inventory playbooks/main.yml --tags "app2"
ثامناً: التعامل مع بيئات متعددة
مثال على جرد خوادم staging و production
ini[staging]
staging1.example.com
[production]
prod1.example.com
prod2.example.com
يمكن في الـ Playbook استخدام شرط لتمييز البيئة عبر متغير:
yaml- hosts: all
vars:
app_env: "{{ group_names[0] }}"
تاسعاً: دمج مع CI/CD
يمكن تشغيل Ansible كجزء من خط أنابيب CI/CD في أدوات مثل GitLab CI أو Jenkins.
مثال GitLab CI:
yamldeploy_staging:
script:
- ansible-playbook -i inventory playbooks/main.yml --tags "app1" --limit staging
عاشراً: إدارة الإصدارات والتحديثات
لضمان إمكانية التراجع rollback، يمكن اتباع تقنيات مثل:
-
نسخ احتياطي للملفات القديمة قبل النشر
-
استخدام Git لتتبع إصدار كل تطبيق
-
حفظ النسخ السابقة من إعدادات Apache وملفات PHP
جدول: مقارنة بين طرق النشر اليدوي والنشر باستخدام Ansible
| المعيار | النشر اليدوي | Ansible |
|---|---|---|
| الأتمتة | ❌ | ✅ |
| قابلية التكرار | منخفضة | عالية |
| التوسّع إلى خوادم متعددة | صعب | سهل وسريع |
| إدارة الإعدادات | غير مركزية | مركزية باستخدام ملفات YAML |
| التتبع والتحقق | يتطلب توثيق يدوي | ممكن عبر Git وملفات Playbook |
| الأمان | يعتمد على المستخدم | مبني على SSH وممارسات أمان قوية |
الخاتمة
يُعد Ansible أداة محورية في تنفيذ عمليات نشر آمنة وقابلة للتوسعة لتطبيقات PHP متعددة على Ubuntu. من خلال الاعتماد على هيكلة مرنة وأدوار متخصصة، يمكن لأي فريق تطوير تبسيط الإجراءات المعقدة وتحقيق استقرار في بيئة الإنتاج. في ظل تصاعد تعقيد البنية التحتية، يصبح الأتمتة عبر Ansible ضرورة أكثر من كونها اختيارًا.
المراجع:
-
The Ansible Documentation – https://docs.ansible.com/
-
Ubuntu Server Guide – https://ubuntu.com/server/docs

